#!/usr/bin/env node

/**
 * 简单的API测试脚本
 * 绕过Cypress依赖问题，直接使用Node.js和axios测试API端点
 */

import axios from 'axios'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'

// 获取当前文件目录（ES模块中替代__dirname的方法）
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 测试配置
const config = {
  baseUrl: 'http://127.0.0.1:8081', // 假设前端开发服务器在这个地址运行
  apiBaseUrl: 'http://127.0.0.1:8080/api', // 假设后端API在这个地址运行
  username: 'admin', // 默认测试用户名
  password: 'admin123', // 默认测试密码
  outputDir: path.join(__dirname, '../cypress/reports'),
  outputFile: path.join(__dirname, '../cypress/reports/simple-api-test-results.json'),
}

// 测试结果
const testResults = {
  timestamp: new Date().toISOString(),
  environment: 'local development',
  testType: 'API Integration Test',
  module: '人事管理',
  tests: [],
  summary: {
    total: 0,
    passed: 0,
    failed: 0,
  },
}

// 日志函数
function log(message, type = 'info') {
  const colors = {
    info: '\x1b[34m', // 蓝色
    success: '\x1b[32m', // 绿色
    error: '\x1b[31m', // 红色
    warning: '\x1b[33m', // 黄色
    reset: '\x1b[0m', // 重置
  }

  const prefixes = {
    info: 'ℹ',
    success: '✓',
    error: '✗',
    warning: '⚠',
  }

  console.log(`${colors[type]}${prefixes[type]} ${message}${colors.reset}`)
}

// 测试函数
async function runTest(name, testFunction) {
  testResults.summary.total++

  try {
    log(`开始测试: ${name}`)
    await testFunction()
    log(`测试通过: ${name}`, 'success')

    testResults.tests.push({
      name,
      status: 'passed',
      timestamp: new Date().toISOString(),
    })
    testResults.summary.passed++
  } catch (error) {
    log(`测试失败: ${name}`, 'error')
    log(`  错误: ${error.message}`, 'error')

    testResults.tests.push({
      name,
      status: 'failed',
      error: error.message,
      timestamp: new Date().toISOString(),
    })
    testResults.summary.failed++
  }
}

// 创建测试报告目录
function ensureReportDir() {
  if (!fs.existsSync(config.outputDir)) {
    fs.mkdirSync(config.outputDir, { recursive: true })
  }
}

// 保存测试结果
function saveTestResults() {
  ensureReportDir()
  fs.writeFileSync(config.outputFile, JSON.stringify(testResults, null, 2))
  log(`测试结果已保存到: ${config.outputFile}`)

  // 同时更新summary.md
  const summaryMd = `# 测试报告摘要

## 基本信息
- **测试时间**: ${new Date(testResults.timestamp).toLocaleString('zh-CN')}
- **测试环境**: ${testResults.environment}
- **测试类型**: ${testResults.testType}
- **测试模块**: ${testResults.module}

## 测试统计
- **总测试数**: ${testResults.summary.total}
- **通过测试**: ${testResults.summary.passed}
- **失败测试**: ${testResults.summary.failed}

## 详细结果

${testResults.tests
  .map(
    test => `### ${test.name}
- **状态**: ${test.status === 'passed' ? '✅ 通过' : '❌ 失败'}
- **时间**: ${new Date(test.timestamp).toLocaleString('zh-CN')}
${test.error ? `- **错误信息**: ${test.error}` : ''}

`
  )
  .join('')}

## 结论
${testResults.summary.failed === 0 ? '✅ 所有测试通过！' : `❌ 有 ${testResults.summary.failed} 个测试失败，请检查错误信息。`}
`

  const summaryMdPath = path.join(config.outputDir, 'summary.md')
  fs.writeFileSync(summaryMdPath, summaryMd)
  log(`测试报告摘要已更新到: ${summaryMdPath}`)
}

// 登录获取token
async function login() {
  log('正在登录系统...')
  try {
    const response = await axios.post(`${config.apiBaseUrl}/auth/login`, {
      username: config.username,
      password: config.password,
    })

    if (response.status === 200 && response.data.code === 0 && response.data.token) {
      log('登录成功！', 'success')
      return response.data.token
    } else {
      throw new Error('登录失败: ' + (response.data.msg || '未知错误'))
    }
  } catch (error) {
    log(`登录失败: ${error.message}`, 'error')
    throw error
  }
}

// 人事管理模块的API测试
async function runHumanResourceTests() {
  let token = null

  try {
    // 登录获取token
    token = await login()

    // 创建axios实例，包含认证信息
    const api = axios.create({
      baseURL: config.apiBaseUrl,
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json',
      },
    })

    // 测试部门架构API
    await runTest('获取部门列表', async () => {
      const response = await api.get('/user/department/list')
      if (response.status !== 200 || response.data.code !== 0) {
        throw new Error(`API返回异常: ${response.data.msg || '未知错误'}`)
      }
      log(`  部门数量: ${response.data.data?.length || 0}`)
    })

    // 测试岗位职称API
    await runTest('获取岗位列表', async () => {
      const response = await api.get('/user/position/list')
      if (response.status !== 200 || response.data.code !== 0) {
        throw new Error(`API返回异常: ${response.data.msg || '未知错误'}`)
      }
      log(`  岗位数量: ${response.data.data?.length || 0}`)
    })

    // 测试员工列表API
    await runTest('获取员工列表', async () => {
      const response = await api.get('/user/user/list', {
        params: { page: 1, limit: 10 },
      })
      if (response.status !== 200 || response.data.code !== 0) {
        throw new Error(`API返回异常: ${response.data.msg || '未知错误'}`)
      }
      log(`  员工总数: ${response.data.data?.total || 0}`)
    })

    // 测试员工档案API
    await runTest('获取员工档案列表', async () => {
      const response = await api.get('/user/archives/list', {
        params: { page: 1, limit: 10 },
      })
      if (response.status !== 200 || response.data.code !== 0) {
        throw new Error(`API返回异常: ${response.data.msg || '未知错误'}`)
      }
      log(`  档案总数: ${response.data.data?.total || 0}`)
    })
  } catch (error) {
    log(`测试过程中发生错误: ${error.message}`, 'error')
  }
}

// 主函数
async function main() {
  logTitle('直律OA系统 - 人事管理模块API测试')

  try {
    await runHumanResourceTests()
  } catch (error) {
    log(`测试执行失败: ${error.message}`, 'error')
  } finally {
    // 保存测试结果
    saveTestResults()

    // 输出测试摘要
    logTitle('测试摘要')
    log(`总测试数: ${testResults.summary.total}`)
    log(`通过测试: ${testResults.summary.passed}`, 'success')
    log(
      `失败测试: ${testResults.summary.failed}`,
      testResults.summary.failed > 0 ? 'error' : 'info'
    )

    if (testResults.summary.failed === 0) {
      log('✅ 所有测试通过！', 'success')
    } else {
      log(`❌ 有 ${testResults.summary.failed} 个测试失败！`, 'error')
    }
  }
}

// 标题日志函数
function logTitle(message) {
  console.log('\n' + '='.repeat(50))
  console.log(' '.repeat(20) + message)
  console.log('='.repeat(50) + '\n')
}

// 检查是否有命令行参数
function parseArgs() {
  const args = process.argv.slice(2)

  for (let i = 0; i < args.length; i++) {
    if (args[i] === '--username' && args[i + 1]) {
      config.username = args[i + 1]
      i++
    } else if (args[i] === '--password' && args[i + 1]) {
      config.password = args[i + 1]
      i++
    } else if (args[i] === '--api-base-url' && args[i + 1]) {
      config.apiBaseUrl = args[i + 1]
      i++
    }
  }
}

// 执行主函数
parseArgs()
main().catch(err => {
  log(`程序执行失败: ${err.message}`, 'error')
  process.exit(1)
})
